home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / Oberon⁄F™ 1.2 / Preinstalled version / System / Docu / Files (.txt) < prev    next >
Encoding:
Oberon Document  |  1996-04-03  |  27.0 KB  |  427 lines  |  [oODC/obnF]

  1. Documents.StdDocumentDesc
  2. Documents.DocumentDesc
  3. Containers.ViewDesc
  4. Views.ViewDesc
  5. Stores.StoreDesc
  6. Documents.ModelDesc
  7. Containers.ModelDesc
  8. Models.ModelDesc
  9. Stores.ElemDesc
  10. TextViews.StdViewDesc
  11. TextViews.ViewDesc
  12. TextModels.StdModelDesc
  13. TextModels.ModelDesc
  14. TextModels.AttributesDesc
  15. Helvetica
  16. TextRulers.StdRulerDesc
  17. TextRulers.RulerDesc
  18. TextRulers.StdStyleDesc
  19. TextRulers.StyleDesc
  20. TextRulers.AttributesDesc
  21. Helvetica
  22. Helvetica
  23. Helvetica
  24. HostPictures.StdViewDesc
  25. Geneva
  26. riders
  27. at beginning
  28. at pos = 5
  29. at end
  30. Helvetica
  31. StdLinks.LinkDesc
  32. StdCmds.OpenBrowser('Obx/Docu/Ascii', 'ObxAscii Docu')
  33. Helvetica
  34. Helvetica
  35. Files
  36. DEFINITION Files;
  37.     CONST exclusive = FALSE; shared = TRUE;
  38.     TYPE
  39.         Name = ARRAY 32 OF CHAR;
  40.         Type = ARRAY 8 OF CHAR;
  41.         FileInfo = POINTER TO RECORD
  42.             next: FileInfo;
  43.             name: Name;
  44.             length: LONGINT;
  45.             type: Type
  46.         END;
  47.         LocInfo = POINTER TO RECORD
  48.             next: LocInfo;
  49.             name: Name
  50.         END;
  51.         Locator = POINTER TO LocatorDesc;
  52.         LocatorDesc = RECORD
  53.             res: LONGINT;
  54.             PROCEDURE (l: Locator) This (path: ARRAY OF CHAR): Locator
  55.         END;
  56.         File = POINTER TO FileDesc;
  57.         FileDesc = RECORD
  58.             type-: Type;
  59.             PROCEDURE (f: File) Length (): LONGINT;
  60.             PROCEDURE (f: File) NewReader (old: Reader): Reader;
  61.             PROCEDURE (f: File) NewWriter (old: Writer): Writer;
  62.             PROCEDURE (f: File) Flush;
  63.             PROCEDURE (f: File) Register (name: Name; type: Type; VAR res: LONGINT);
  64.             PROCEDURE (f: File) Close;
  65.             PROCEDURE (f: File) InitType (type: Type)
  66.         END;
  67.         Reader = POINTER TO ReaderDesc;
  68.         ReaderDesc = RECORD
  69.             eof: BOOLEAN;
  70.             PROCEDURE (r: Reader) Base (): File;
  71.             PROCEDURE (r: Reader) Pos (): LONGINT;
  72.             PROCEDURE (r: Reader) SetPos (pos: LONGINT);
  73.             PROCEDURE (r: Reader) ReadByte (VAR x: CHAR);
  74.             PROCEDURE (r: Reader) ReadBytes (VAR x: ARRAY OF CHAR; beg, len: LONGINT)
  75.         END;
  76.         Writer = POINTER TO WriterDesc;
  77.         WriterDesc = RECORD
  78.             PROCEDURE (w: Writer) Base (): File;
  79.             PROCEDURE (w: Writer) Pos (): LONGINT;
  80.             PROCEDURE (w: Writer) SetPos (pos: LONGINT);
  81.             PROCEDURE (w: Writer) WriteByte (x: CHAR);
  82.             PROCEDURE (w: Writer) WriteBytes (VAR x: ARRAY OF CHAR; beg, len: LONGINT)
  83.         END;
  84.         Directory = POINTER TO DirectoryDesc;
  85.         DirectoryDesc = RECORD
  86.             PROCEDURE (d: Directory) This (path: ARRAY OF CHAR): Locator;
  87.             PROCEDURE (d: Directory) Temp (): File;
  88.             PROCEDURE (d: Directory) New (loc: Locator): File;
  89.             PROCEDURE (d: Directory) Old (loc: Locator; name: Name; shared: BOOLEAN): File;
  90.             PROCEDURE (d: Directory) Delete (loc: Locator; name: Name);
  91.             PROCEDURE (d: Directory) Rename (loc: Locator; old, new: Name);
  92.             PROCEDURE (d: Directory) SameFile (loc0: Locator;name0: Name;
  93.                                                                         loc1: Locator; name1: Name): BOOLEAN;
  94.             PROCEDURE (d: Directory) FileList (loc: Locator): FileInfo;
  95.             PROCEDURE (d: Directory) LocList (loc: Locator): LocInfo
  96.         END;
  97.     VAR dir-, stdDir-: Directory;
  98.     PROCEDURE SetDir (d: Directory);
  99. END Files.
  100. Most programmers never need to deal with files directly, instead they can use readers and writers (of module -> Stores) which are set up already by Oberon!
  101. Module Files provides the abstractions necessary to handle most aspects of a hierarchical file system. A file is a sequence of bytes. Several access paths can be open simultaneously on the same file, possibly at different positions.
  102. A file and its access paths are modeled as separate data structures, namely as File and Reader/Writer. Where a statement applies both to readers and writers, the term "rider" will be used. An open rider is never closed explicitly, and an application can create as many riders as it needs.
  103. Picture a:  File with three Riders
  104. Each file resides at some location in the file hierarchy (i.e. in a subdirectory). In Oberon, a location is described by a locator object. A directory object provides a procedure which creates a locator, given a path name in the host platform's file name syntax. Most other directory operations take a locator as parameter, to find the specific subdirectory where the operation should be performed.
  105. For temporary files, a system-specific (implicit) location is used. Temporary files are used as scratch files, and cannot be registered in the file directory. Module Dialog provides further sources for file locators, via standard file dialogs.
  106. A file itself is specified by a location and a name. The name is the file's local name at the given location, i.e. it cannot be a path name.
  107. A directory object provides three procedures to access a file: New, Temp, and Old. New creates a new file. This file already has a particular location, but is anonymous, i.e. it has no name (yet). When the file's contents are written, the file can be registered under a given name, possibly replacing an already existing file which in turn becomes anonymous itself. File registration is an atomic action, which reduces the danger that a file is replaced by a new, but incomplete or corrupted, file.
  108. Anonymous files for which no more riders exist are automatically deleted by the garbage collector, at an appropriate time.
  109. Temp creates a temporary file. Such a file is never registered, and thus remains anonymous.
  110. Old looks up and opens an existing file, given its name and location. The file may either be opened in shared or in exclusive mode. "shared" means that it may be looked up and opened by several programs simultaneously, but that none may alter it (immutable file). Even if a file has been opened, its entry in the file directory is replaced when a new file is registered at the same location and under the same name. In this case, the old file remains accessible through the existing file readers. However, looking up this file with procedure Old yields the most recently registered file version. When no more riders on an older file version exist, the disk space occupied by the file is reclaimed by the garbage collector eventually.
  111. Opening a file in shared mode is the rule in Oberon; opening a file in exclusive mode is an infrequent exception. "exclusive" means that at most one program may open a file. As long as the file is not closed again, other programs remain locked out, i.e. Old on the same file fails. An exclusively opened file may be modified (mutable file), which is useful for simple data base applications. Registering a new file under the same name as an exclusively opened file has the same effect as for shared files, i.e. the existing file becomes anonymous, and is garbage collected eventually.
  112. A file can be opened in exclusive mode, closed, and then be opened again in shared mode, for example. However, it can never be open in exclusive and in shared mode simultaneously.
  113. Open files for which no more riders exist are automatically closed by the garbage collector at an appropriate time. For files opened in exclusive mode, it is recommended that they be closed explicitly, in order to make them accessible again to other programs as early as possible.
  114. A directory object represents all accessible files (not just one subdirectory), independent of their location in the file hierarchy. There is exactly one file hierarchy. However, every Oberon service may implement its own file directory object. Such an object represents exactly the same file hierarchy, but may provide different ways to look up files, e.g. by applying default search paths, or it may define a current directory relative to which path names are evaluated, etc.
  115. Files are typed. This means that each file has a type attribute which is a string, typically of length 3 or 4. On some platforms, the host file system knows about file types (Mac OS), while on others file types are simulated by using file suffixes as extensions (Windows). File types are useful to tell the system which operations are permissible on files and which aren't. For example, it is possible to install file converters (-> Converters) in Oberon/F which translate between file and memory data structures.
  116. Example: 
  117. ObxAscii
  118. CONST exclusive, shared
  119. Values which can be passed to the Directory.Old.shared parameter, to determine whether a file should be opened in shared or in exclusive mode.
  120. TYPE Name
  121. String type for file names.
  122. TYPE Type
  123. String type for file type names. Under Windows, file type names correspond to the three-character file name extensions, e.g. file XYZ.txt has type txt. On Mac OS, the appropriate four-character file type name is used, e.g. an ASCII file xyz has file type TEXT.
  124. TYPE Locator
  125. Interface
  126. A file locator identifies a location in the file system.
  127. File locators are used internally, and sometimes in commands which operate on non-Oberon files.
  128. File locators are extended internally.
  129. res: LONGINT
  130. Directory operations return their results in the locator's res field.
  131. The following result codes are predefined:
  132. res = 0    no error
  133. res = 1    invalid parameter (name or locator)
  134. res = 2    location or file not found
  135. res = 3    file already exists
  136. res = 4    write-protection
  137. res = 5    io error
  138. res = 6    access denied
  139. res = 7    illegal file type
  140. res = 8    cancelled
  141. A particular Oberon implementation may return additional, platform-specific, error codes. These error codes always have negative values.
  142. PROCEDURE (l: Locator) This (path: ARRAY OF CHAR): Locator
  143. Interface
  144. This evaluates a relative path, starting from the location specified by l.
  145. path # NIL    20
  146. result # NIL
  147.     l.res = 0    no error
  148. result = NIL
  149.     l.res = 1    invalid name
  150.     l.res = 5    io error
  151. TYPE FileInfo
  152. This record represents information about a file.
  153. next: FileInfo
  154. Next entry in the list of file descriptors. No particular ordering is defined.
  155. name: Name    name # ""
  156. The file's name.
  157. length: LONGINT    length >= 0
  158. The file's length in bytes.
  159. type: Type
  160. The file's type.
  161. TYPE LocInfo
  162. This record represents information about a location.
  163. next: LocInfo
  164. Next entry in the list of location descriptors. No particular ordering is defined.
  165. name: Name    name # ""
  166. The file's name.
  167. TYPE File
  168. Interface
  169. A file is a carrier for a linear sequence of bytes, which typically resides on a hard disk or similar device.
  170. Files are allocated by file directories.
  171. Files are used by commands which operate on non-Oberon files.
  172. Files are extended internally.
  173. type-: Type
  174. This file's file type.
  175. PROCEDURE (f: File) Length (): LONGINT
  176. Interface
  177. Returns the current length of the file in bytes.
  178. result >= 0
  179. PROCEDURE (f: File) NewReader (old: Reader): Reader
  180. Interface
  181. Returns a reader which has the appropriate type (for this file type). If old = NIL, then a new reader is allocated. If old # NIL and old has the appropriate type, old is returned. Otherwise, a new reader is allocated. The returned reader is connected to f, its eof field is set to FALSE, and its position is somewhere on the file. If an old reader is passed as parameter, the old position will be retained if possible.
  182. If an old reader is passed as parameter, it is the application's responsibility to guarantee that it is not in use anymore. Passing an unused old reader is recommended because it avoids unnecessary allocations.
  183. result # NIL
  184. ~result.eof
  185. old # NIL & old.Base() = f
  186.     result.Pos() = old.Pos()
  187. old = NIL OR old.Base() # f
  188.     result.Pos() = 0
  189. PROCEDURE (f: File) NewWriter (old: Writer): Writer
  190. Interface
  191. Returns a writer which has the appropriate type (for this file type). If old = NIL, then a new writer is allocated. If old # NIL and old has the appropriate type, old is returned. Otherwise, a new writer is allocated. The returned writer is connected to f, and its position is somewhere on the file. If an old writer is passed as parameter, the old position will be retained if possible.
  192. If an old writer is passed as parameter, it is the application's responsibility to guarantee that it is not in use anymore. Passing an unused old writer is recommended because it avoids unnecessary allocations.
  193. Read-only files allow no writers at all. In such cases, NewWriter returns NIL.
  194. result # NIL
  195.     old # NIL & old.Base() = f
  196.         result.Pos() = old.Pos()
  197.     old = NIL OR old.Base() # f
  198.         result.Pos() = f.Length()
  199. result = NIL
  200.     read-only file
  201. PROCEDURE (f: File) Flush
  202. Empty
  203. To guarantee consistency of the file, Flush should be called after the last writer operation. Superfluous calls of Flush have no effect.
  204. Close may call Flush internally.
  205. PROCEDURE (f: File) Register (name: Name; type: Type; VAR res: LONGINT)
  206. Interface
  207. Register makes an anonymous file permanently available. If a file with the same name at the same location already exists, it is deleted first. Register can be considered as an atomic action.
  208. Only files opened with procedure New may be registered. Trying to register a file opened with Old results in a precondition violation error.
  209. If an already existing file is deleted during Register, only its entry in the file directory is removed. The file's contents are still available to existing file riders. The space occupied by a file is reclaimed at an unspecified time after no more riders on it exist anymore.
  210. The file f and the riders operating on file f are not valid anymore after registering f, i.e. no more file or rider operations may be performed on it. However, the registered file can be retrieved by procedure Old again.
  211. Register may call Flush internally, and closes the file.
  212. Each registered file has a file type, which is passed to Register in the type parameter.
  213. f is anonymous and not temporary    20
  214. name # ""    21
  215. name is not a file name    22
  216. res = 0    no error
  217. res = 2    location not found
  218. res = 4    write-protection
  219. res = 5    io error
  220. res = 7    illegal file type
  221. res = 8    cancelled
  222. PROCEDURE (f: File) Close
  223. Interface
  224. Closes an open file. Close does nothing if the file is not open or if it has been opened in "shared" mode. If a call to New or Old is not balanced by a call to Close, the Close is later performed automatically, at an unspecified time. If it is known that a file won't be used again, it is recommended to call its Close procedure.
  225. The file f and the riders operating on file f are not valid anymore after closing f, i.e. no more file or rider operations may be performed on it. However, the closed file can be retrieved and opened again by procedure Old.
  226. Close may call Flush internally.
  227. Close should (but need not necessarily) be called explicitly after a file is not needed anymore.
  228. PROCEDURE (f: File) InitType (type: Type)
  229. Initializes the file's type field.
  230. type # ""    20
  231. f.type = ""  OR  f.type = type    21
  232. TYPE Reader
  233. Interface
  234. Reading access path to a file carrier.
  235. Readers are allocated by their base files.
  236. Readers are used by commands which read non-Oberon files and operate at the byte level.
  237. Readers are extended internally.
  238. eof: BOOLEAN
  239. Set when it has been attempted to read the byte after the end of the file (by ReadByte or ReadBytes). Reset when the reader is generated or positioned.
  240. PROCEDURE (r: Reader) Base (): File
  241. Interface
  242. Returns the file to which the reader is currently connected.
  243. result # NIL
  244. PROCEDURE (r: Reader) Pos (): LONGINT
  245. Interface
  246. Returns the reader's current position.
  247. 0 <= result <= r.Base().Length()
  248. PROCEDURE (r: Reader) SetPos (pos: LONGINT)
  249. Interface
  250. Sets the reader's current position to pos and clears the eof flag.
  251. pos >= 0    20
  252. pos <= r.Base().Length()    21
  253. r.Pos() = pos
  254. ~r.eof
  255. PROCEDURE (r: Reader) ReadByte (VAR x: CHAR)
  256. Interface
  257. Attempts to read the byte after the current position. If successful, it increments the position by one. If the current position (before reading) is at the end of the available data, i.e. Pos equals the carrier data's length, then r.eof is set.
  258. ReadByte internally may call SetPos.
  259. r.Pos()' < r.Length()
  260.     r.Pos() = r.Pos()' + 1
  261.     ~r.eof
  262.     x = byte after r.Pos()'
  263. r.Pos()' = r.Length()
  264.     r.Pos() = r.Length()
  265.     r.eof
  266.     x = 0X
  267. PROCEDURE (r: Reader) ReadBytes (VAR x: ARRAY OF CHAR; beg, len: LONGINT)
  268. Default
  269. Attempts to read len bytes after the current position. It increments the position by the number of bytes which have been read successfully. If reading is continued beyond the file's length, then r.eof is set. The data are transferred to the array x starting at element beg.
  270. ReadBytes is implemented in terms of ReadByte operations, but may be overwritten for efficiency.
  271. ReadBytes internally may call SetPos.
  272. beg >= 0    20
  273. len >= 0    21
  274. beg + len <= LEN(x)    22
  275. r.Pos()' <= r.Length() - len
  276.     r.Pos() = r.Pos()' + len
  277.     ~r.eof
  278.     len bytes read after r.Pos()' and transferred into x
  279. r.Pos()' > r.Length() - len
  280.     r.Pos() = r.Length()
  281.     r.eof
  282.     r.Length() - r.Pos()' bytes read after r.Pos()' and transferred into x
  283. TYPE Writer
  284. Interface
  285. Writing access path to a file carrier.
  286. Writers are allocated by their base files.
  287. Writers are used by commands which write non-Oberon files and operate at the byte level.
  288. Writers are extended internally.
  289. PROCEDURE (w: Writer) Base (): File
  290. Interface
  291. Returns the file to which the writer is currently connected.
  292. result # NIL
  293. PROCEDURE (w: Writer) Pos (): LONGINT
  294. Interface
  295. Returns the writer's current position.
  296. 0 <= result <= w.Base().Length()
  297. PROCEDURE (w: Writer) SetPos (pos: LONGINT)
  298. Interface
  299. Sets the writer's current position to pos.
  300. pos >= 0    20
  301. pos <= w.Base().Length()    21
  302. w.Pos() = pos
  303. PROCEDURE (w: Writer) WriteByte (x: CHAR)
  304. Interface
  305. Writes a byte after the current position, then increments the current position. If the current position is at the end of the carrier data, the writer's length is incremented also.
  306. WriteByte internally may call SetPos.
  307. x written at w.Pos()'
  308. w.Pos() = w.Pos()' + 1
  309. w.Pos()' < w.Base().Length()'
  310.     w.Base().Length() = w.Base().Length()'
  311.     x has overwritten old value after w.Pos()'
  312. w.Pos()' = w.Base().Length()'
  313.     w.Base().Length() = w.Base().Length()' + 1
  314.     x was appended
  315. PROCEDURE (w: Writer) WriteBytes (VAR x: ARRAY OF CHAR; beg, len: LONGINT)
  316. Default
  317. Writes len bytes after the current position and increments the position accordingly. If necessary the stream's length is increased. The data are transferred from array x starting with element beg.
  318. WriteBytes is implemented in terms of WriteByte operations, but may be overwritten for efficiency.
  319. WriteBytes internally may call SetPos.
  320. beg >= 0    20
  321. len >= 0    21
  322. beg + len <= LEN(x)    22
  323. len bytes transferred from variable x to carrier
  324. w.Pos() = w.Pos()' + len
  325. w.Pos()' + len <= w.Base().Length()'
  326.     w.Base().Length() = w.Base().Length()'
  327. w.Pos()' + len > w.Base().Length()'
  328.     w.Base().Length() = w.Pos()' + len
  329. TYPE Directory
  330. Interface
  331. Directory for the lookup in and manipulation of file directories.
  332. File directories are allocated by Oberon.
  333. File directories are used by commands which operate on non-Oberon files.
  334. File directories are extended internally.
  335. PROCEDURE (d: Directory) This (path: ARRAY OF CHAR): Locator
  336. Interface
  337. Returns a locator, given a path name in the host platform's syntax.
  338. This may perform some validity checks, e.g. whether the syntax of the name is correct. Passing the empty string yields a default location.
  339. result # NIL
  340. result.res = 0
  341.     legal locator
  342. result.res # 0
  343.     illegal locator
  344. PROCEDURE (d: Directory) Temp (): File
  345. Interface
  346. Returns a temporary file. This file is anonymous, i.e. not registered in a directory. (In host file systems where anonymous files are not directly supported, they may appear under temporary names in a suitable subdirectory.) Registration is not possible on a temporary file.
  347. A temporary file always has both read and write capabilities (mutable file).
  348. result # NIL
  349. PROCEDURE (d: Directory) New (loc: Locator): File
  350. Interface
  351. Returns a new file object (or NIL if this is not possible). This file is anonymous, i.e. not yet registered in the directory. (In host file systems where anonymous files are not directly supported, they may appear under temporary names in subdirectory loc.) If the file is registered later, it will appear in the subdirectory specified by loc.
  352. A new file always has both read and write capabilities (mutable file).
  353. If location loc does not exist, the user may be asked whether the location should be created (loc.res = 0) or not (loc.res = 8).
  354. loc # NIL    20
  355. result # NIL
  356.     loc.res = 0    no error
  357. result = NIL
  358.     loc.res = 1    invalid name
  359.     loc.res = 2    location not found
  360.     loc.res = 4    write-protection
  361.     loc.res = 5    io error
  362.     loc.res = 8    cancelled
  363. PROCEDURE (d: Directory) Old (loc: Locator; name: Name; shared: BOOLEAN): File
  364. Interface
  365. Looks up and opens a file with name name at location loc. It returns this file (or NIL if this is not possible). Parameter shared determines whether the returned file is in shared or in exclusive mode. A shared file provides read-only access. This means that several applications may read the file simultaneously, but it may not be modified. An exclusively opened file provides exclusive read and write access. This means that both read and write access are denied to any other application. Note however, that the application may pass on the file pointer to wherever it likes. The point is, another application cannot gain access to the file solely via the file directory, without cooperation of the application which currently has access. Moreover, "exclusive" access does not imply that only one rider may be active on the file.
  366. A file is usually opened in shared mode. To change its contents, a new file is generated and then registered under the old name. If only a small part of the data is actually changed, it may be more appropriate to use the exclusive mode instead, e.g. when implementing simple data bases. In this case, the file should be closed explicitly as soon as it isn't needed anymore.
  367. loc # NIL    20
  368. result # NIL
  369.     loc.res = 0    no error
  370. result = NIL
  371.     loc.res = 0    file not found
  372.     loc.res = 1    invalid name
  373.     loc.res = 2    location not found
  374.     loc.res = 6    access denied
  375. PROCEDURE (d: Directory) Delete (loc: Locator; name: Name)
  376. Interface
  377. Deletes the file specified by loc and name.
  378. loc # NIL    20
  379. loc.res = 0    no error
  380. loc.res = 1    invalid parameter (name or locator)
  381. loc.res = 2    location or file not found
  382. loc.res = 4    write-protection
  383. loc.res = 5    io error
  384. PROCEDURE (d: Directory) Rename (loc: Locator; old, new: Name)
  385. Interface
  386. Rename the file specified by loc and new to the local name new. If a file with name new already exists, an error is reported.
  387. loc # NIL    20
  388. loc.res = 0    no error
  389. loc.res = 1    invalid parameter (locator or name)
  390. loc.res = 2    location or file not found
  391. loc.res = 3    file already exists
  392. loc.res = 4    write-protection
  393. loc.res = 5    io error
  394. PROCEDURE (d: Directory) SameFile (loc0: Locator; name0: Name;
  395.                                                                     loc1: Locator; name1: Name): BOOLEAN;
  396. Interface
  397. Determines whether two (locator, name) pairs denote the same file.
  398. loc0 # NIL    20
  399. name0 # ""    21
  400. loc1 # NIL    22
  401. name1 # ""    23
  402. PROCEDURE (d: Directory) FileList (loc: Locator): FileInfo
  403. Interface
  404. Returns information about the files at a given location. The result is a linear list of file descriptions, in no particular order.
  405. loc # NIL    20
  406. PROCEDURE (d: Directory) LocList (loc: Locator): LocInfo
  407. Interface
  408. Returns information about subdirectories at a given location. The result is a linear list of location (subdirectory) descriptions, in no particular order.
  409. loc # NIL    20
  410. VAR dir-, stdDir-: Directory    (dir # NIL) & (stdDir # NIL)
  411. Directories for the lookup of files.
  412. PROCEDURE SetDir (d: Directory)
  413. Assigns directory.
  414. SetDir is used in configuration routines.
  415. d # NIL    20
  416. stdDir' = NIL
  417.     stdDir = d
  418. stdDir' # NIL
  419.     stdDir = stdDir'
  420. dir = d
  421. TextControllers.StdCtrlDesc
  422. TextControllers.ControllerDesc
  423. Containers.ControllerDesc
  424. Controllers.ControllerDesc
  425. Helvetica
  426. Documents.ControllerDesc
  427.